package mr

//
// RPC definitions.
//
// remember to capitalize all names.
//

import "os"
import "strconv"

//
// example to show how to declare the arguments
// and reply for an RPC.
//

type ExampleArgs struct {
	X int
}

type ExampleReply struct {
	Y int
}

// Add your RPC definitions here.

type RegisterArgs struct {
}

type RegisterReply struct {
	Wid int
}

// 任务请求
//
type TaskType int32

const (
	Map_T    TaskType = 1000
	Reduce_T TaskType = 1001
	Empty_T  TaskType = 0
)

// 任务请求参数（没有参数）
type TaskArgs struct {
}

/**
三种任务类型
对于Map任务，key是对应的文件名
对于Reduce任务，key是Reducer的编号
如果没有任务的话，key无意义
*/
type TaskReply struct {
	Task_type TaskType
	Key       string
	Splits    []string // reducer需要的参数，reducer需要从每个split中获取对应partition的数据，因此需要split的列表
}

// 返回Map的结果
// key是完成的文件名
type MapTaskFinishArgs struct {
	Key    string // 文件名
	Output string // 存储结果的目录
}

type MapTaskFinishReply struct {
}

// 返回Reduce的结果
// key是Reducer的编号
type ReduceTaskFinishArgs struct {
	Key    string // 完成了第几个Partition
	Output string // 存储结果的文件路径
}

type ReduceTaskFinishReply struct {
}

// 把Map的结果分为NReduce份
const NReduce int = 16

// Cook up a unique-ish UNIX-domain socket name
// in /var/tmp, for the coordinator.
// Can't use the current directory since
// Athena AFS doesn't support UNIX-domain sockets.
func coordinatorSock() string {
	s := "/var/tmp/824-mr-"
	s += strconv.Itoa(os.Getuid())
	return s
}
